# 需求1：打开注册页面A，在用户名文本框上点击鼠标右键（模拟鼠标右键菜单操作）
# 需求2：打开注册页面A，输入用户名admin，暂停3秒钟后，双击鼠标左键[选中admin]（模拟双击选中文本）

# 从time模块导入sleep函数，用于程序强制暂停（等待页面加载、操作间隔）
from time import sleep
# 从selenium库导入webdriver模块，用于创建浏览器驱动、控制浏览器
from selenium import webdriver
# 从selenium导入ActionChains类，核心用于模拟鼠标复杂操作（右键、双击、悬停等）
from selenium.webdriver import ActionChains
# 从selenium驱动模块导入By类，用于规范元素定位方式（selenium4+推荐，替代旧版find_element_by_*）
from selenium.webdriver.common.by import By

# 1. 初始化并打开Chrome浏览器
# executable_path：指定ChromeDriver驱动的本地路径（适配selenium3及以下版本，需手动下载对应驱动）
# 驱动作用：建立Python代码与Chrome浏览器的通信桥梁
driver = webdriver.Chrome(executable_path='D:/chrome_driver/chromedriver.exe')
# 注释：selenium4及以上版本推荐写法（无需手动指定驱动路径）
# 需提前安装 webdriver-manager 库（pip install webdriver-manager），自动匹配浏览器版本下载驱动
# driver = webdriver.Chrome() # 创建Chrome浏览器对象，后续通过该对象执行所有操作

# 2. 访问目标页面（注册A页面）
# get()方法：接收完整URL，让浏览器加载并显示该网页
driver.get("http://121.43.169.97:8848/pageA.html")

# 放大浏览器窗口（可选，注释状态，取消注释可启用）
# maximize_window()：避免窗口过小导致元素隐藏，提高操作稳定性
# driver.maximize_window()

# 3. 初始化鼠标操作对象
# ActionChains(driver)：创建鼠标/键盘操作链对象，所有鼠标操作需通过该对象调用
# 特点：支持链式调用（多个操作连续执行），需通过perform()方法触发执行
action = ActionChains(driver)

# ---------------------- 需求1：用户名文本框右键操作（以下为注释状态，取消注释可执行）----------------------
# 步骤1：定位用户名输入框（通过CSS_SELECTOR定位id为"userA"的元素，唯一性强）
# username = driver.find_element(By.CSS_SELECTOR, "#userA")  # 新版定位方式（推荐）
# 旧版定位方式（已弃用，不推荐）：username = driver.find_element_by_css_selector("#userA")

# 步骤2：调用右键方法（context_click(element)：模拟鼠标右键点击指定元素）
# cc = action.context_click(username)

# 步骤3：执行鼠标操作（ActionChains的操作需调用perform()才会实际执行，否则仅存储操作不触发）
# cc.perform()

# 合并简写（链式调用，更简洁，推荐写法）
# action.context_click(driver.find_element(By.CSS_SELECTOR, "#userA")).perform()

# ---------------------- 需求2：输入用户名并双击选中 ----------------------
# 步骤1：定位用户名输入框（新版By.CSS_SELECTOR定位，兼容selenium4+）
username2 = driver.find_element(By.CSS_SELECTOR, "#userA")
# 旧版定位方式（已弃用，注释保留参考）：username2 = driver.find_element_by_css_selector("#userA")

# 步骤2：向输入框输入文本"admin"
username2.send_keys("admin")

# 步骤3：暂停3秒（强制等待，确保输入内容已显示在输入框中，避免双击时文本未加载）
sleep(3)

# 步骤4：模拟鼠标双击操作（double_click(element)：模拟鼠标左键双击指定元素）
# 作用：双击输入框中的文本"admin"，实现全选效果（等同于手动双击选中文本）
dc = action.double_click(username2)

# 步骤5：执行双击操作（必须调用perform()，否则双击不会生效）
dc.perform()

# ---------------------- 额外功能：鼠标悬停（以下为注释状态，取消注释可执行）----------------------
# 需求：鼠标移动到"注册按钮"上，预期按钮变色（模拟鼠标悬停效果）
# 步骤1：定位注册按钮（通过XPATH定位第5个<p>标签下的<button>元素，假设按钮在该位置）
# button = driver.find_element(By.XPATH, "//p[5]/button")  # 新版定位方式（推荐）
# 旧版定位方式（已弃用）：button = driver.find_element_by_xpath("//p[5]/button")

# 步骤2：模拟鼠标悬停（move_to_element(element)：将鼠标移动到元素的中心点）
# action.move_to_element(button).perform()

# 4. （可选）保持页面状态，便于观察效果（若需自动关闭，可添加以下代码）
# sleep(5)  # 延长暂停时间，观察双击选中、悬停效果
# driver.quit()  # 关闭浏览器并释放资源